package com.atguigu.tingshu.album.api;

import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.config.mybatisPlus.MybatisPlusConfig;
import com.atguigu.tingshu.common.login.GuiguLogin;
import com.atguigu.tingshu.common.login.GuiguLoginAspect;
import com.atguigu.tingshu.common.result.Result;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.websocket.server.PathParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@Tag(name = "专辑管理")
@RestController
@RequestMapping("api/album/albumInfo")
@SuppressWarnings({"all"})
public class AlbumInfoApiController {

	@Autowired
	private AlbumInfoService albumInfoService;
    @Autowired
    private MybatisPlusConfig mybatisPlusConfig;
    @Autowired
    private GuiguLoginAspect guiguLoginAspect;

	/**
	 * 分页列表查询专辑列表
	 */
	@GuiguLogin
	@Operation(summary = "分页查询专辑列表")
	@PostMapping("/findUserAlbumPage/{pageNo}/{pageSize}")
	public Result findUserAlbumPage(@PathVariable("pageNo")Integer pageNo, //pathvariable用于获取 URL 路径中的路径参数，/users/{id}，通过 @PathVariable("id") 可获取 123。
//																			（RESTful 风格的 URL 路径参数，参数是 URL 路径的一部分）
									                                      // pathparam：用于前端传值，/users?name=zhangsan，通过 @PathParam("name") 可获取 zhangsan。
									@PathVariable("pageSize")Integer pageSize,
									@RequestBody AlbumInfoQuery albumInfoQuery){
//		1.从当前上下文中获取用户id
		Long userId = null == AuthContextHolder.getUserId()?1l:AuthContextHolder.getUserId();
//		把上下文中得到的userId装进前端的查询参数
		albumInfoQuery.setUserId(userId);
//		前端传分页的页码，和每个页多少条数据（size），然后调用服务层方法
//		mybatis给我们封装好了分页查询工具,我们把前端拿到的页码和页数传给这个分页工具：
//		(AlbumListVo是分页展示的数据结构)
		Page<AlbumListVo> page = new Page<>(pageNo,pageSize);
//		将我们设置好了页码和页数的工具分配给分页插件Ipage，调用服务层方法去实施分页
		IPage<AlbumListVo> albumListVoIPage = albumInfoService.findUserAlbumPage(page,albumInfoQuery);
		return Result.ok(albumListVoIPage);
	}



	/**
	 * 删除专辑
	 */
	@Operation(summary = "删除专辑")
	@DeleteMapping("/removeAlbumInfo/{albumId}")
	public Result removeAlbumInfo(@PathVariable("albumId")Long albumId){
//		1.删除是保存的逆向操作
		albumInfoService.removeAlbumInfo(albumId);
		return Result.ok();
	}


	/**
	 * 获取当前用户的专辑列表
	 */
	@GuiguLogin
	@Operation(summary = "获取专辑列表")
	@GetMapping("/findUserAllAlbumList")
	public Result findUserAllAlbumList(){
//		0.获取用户id
		Long userId = null == AuthContextHolder.getUserId() ? 1l:AuthContextHolder.getUserId();
//		1.调用服务层方法
		List<AlbumInfo> albumInfoList = albumInfoService.findUserAllAlbumList(userId);
//		2.返回专辑列表
		return Result.ok(albumInfoList);
	}


	/**
	 * 保存专辑思路：（必须登录，不登录不能访问，如果完成登录模块，会将用户id存储到本地线程中ThreadLocal）
	 * 1.前端传递的数据是什么形式（一般是json格式）
	 * 2.后端如何接收前端传递的数据（一般用@RequestBody
	 * 3.核心是如何处理这些数据（一般是增删改进数据库）
	   *这里，我们把一个专辑的属性值、信息、状态保存进对应的表里，就算保存成功

	 */
	@GuiguLogin
    @Operation(summary = "保存专辑")
	@PostMapping("/saveAlbumInfo")
	public Result saveAlbumInfo(@RequestBody AlbumInfoVo albumInfoVo){
//		1.先获取用户id,并判断其是否为空
		Long userId = AuthContextHolder.getUserId() == null? 1l : (AuthContextHolder.getUserId());
//		2.调用服务层方法
		Boolean flag = albumInfoService.saveAlbumInfo(albumInfoVo,userId);
//		2.再返回数据
		return Result.ok(flag);
	}


	/**
	 * 根据专辑id查看专辑信息
	 *
	 */
	@Operation(summary = "根据专辑id查看专辑信息")
	@GetMapping("/getAlbumInfo/{albumId}")
	public Result getAlbumInfo(@PathVariable("albumId")Long albumId){
//		1.调用服务层方法
		AlbumInfo albumInfo = albumInfoService.getAlbumInfo(albumId);
//		n.返回数据
		return Result.ok(albumInfo);
	}

	/**
	 * 根据专辑id更新专辑信息
	 * @param albumId
	 * @param albumInfoVo
	 * @return
	 */

	@Operation(summary = "根据专辑id更新专辑信息")
	@PutMapping("/updateAlbumInfo/{albumId}")
	public Result updateAlbumInfo(@PathVariable("albumId")Long albumId,
	                              @RequestBody AlbumInfoVo albumInfoVo){ //前端传要更新的专辑的id和更新内容
//		1.调用服务层方法
		albumInfoService.updateAlbumInfo(albumId,albumInfoVo);
//		2.返回数据
		return Result.ok();
	}

	/**
	 * 根据专辑id，获取该专辑的统计信息
	 */
	@Operation(summary = "获取到专辑统计信息")
	@GetMapping("/getAlbumStatVo/{albumId}")
	public Result<AlbumStatVo> getAlbumStatVo(@PathVariable Long albumId){
//		1.调用服务层方法
		AlbumStatVo albumStatVo = this.albumInfoService.getAlbumStatVoByAlbumId(albumId);
//		2.返回数据
		return Result.ok(albumStatVo);
	}

}

